iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
自我挑戰組

2D像素遊戲設計經驗分享系列 第 21

2D像素遊戲開發經驗分享 - Unity 橫向遊戲的基本移動編寫(1)

  • 分享至 

  • xImage
  •  

在上一部份,我們學會了 Unity 讀取玩家鍵盤輸入的方法。

在這裹先為輸入管理器作補充,首先我們可以利用複製貼上已有的輸入方式來製作更多新的輸入方式,只要複製後改變名稱即可。
https://ithelp.ithome.com.tw/upload/images/20231006/20163146m7V2j8ww46.png

然後除了單純的按鈕,我們還可以設計軸的輸入方式,軸的輸入指該輸入有代表正以及負的元素,例如搖桿推至最右為正,推至最左為負,或者是方向鍵按右時為正,按左時為負。角色的移動正可以使用軸來進行操作,這樣的做法除了有對手把的相容性外,還可以節省一個輸入方式的空間。
https://ithelp.ithome.com.tw/upload/images/20231006/20163146HESWzgiSrQ.png

而要讀取軸的數值,我們要用 GetAxis(),而 GetAxis() 亦不是回傳bool而是float,所以我們可以用以下程式碼測試:

void Update()
{
    if (Input.GetAxis("Horizontal") == 1)
        Debug.Log("右方向鍵測試");
    else if (Input.GetAxis("Horizontal") == -1)
        Debug.Log("左方向鍵測試");
}

在遊戲播放時按住左鍵、右鍵、A鍵或者D鍵任一鍵,應該會看到對應的方向的訊息。

現在可以開始針對在場景中的角色移動進行編程了。讓角色在畫面中移動有兩個方法,第一個是直接改變其在畫面中的位置,另一個是利用 Unity 的物理系統對角色施加 Force。

第一個方法,我們可以直接更改兩句上方程式碼來達到效果:

void Update()
{
    if (Input.GetAxis("Horizontal") == 1)
        this.transform.position = new Vector3(0.05f, 0, 0) + this.transform.position;
    else if (Input.GetAxis("Horizontal") == -1)
        this.transform.position = new Vector3(-0.05f, 0, 0) + this.transform.position;
}

因為這個 PlayerMovement 腳本是建立在角色之下的 Component,使用 this. 我們便可提取其他的 Component,而我們這樣便可以做到直接修改它的位置數值。然而各位可能會發現角色移動的反應不是即時出現,因為軸的數值並非即時到達最大的1和-1,再加上 GetAxis() 傳回的不是 bool 而是 float,我們可以進一步優化我們的程式:

void Update()
{
    if (Input.GetAxis("Horizontal") != 0)
        this.transform.position = new Vector3( 0.05f * Input.GetAxis("Horizontal"), 0, 0) 
        + this.transform.position;
}

這裹我們直接使用 GetAxis() 傳回的數值去進行方向的改變,並只要在軸的數值非零時便會觸發移動,讓角色的反應和移動上都有了加速度和減速度。然而,直接修改位值數通常會在自行編寫遊戲物理的遊戲中才會使用,因為要調整每一個細節,如剛剛指的加速度和減速度,都會較為麻煩。以下為我嘗試為角色增加可設定的加速度的例子:

public class PlayerMovement : MonoBehaviour
{
    float currentSpeed;
    float topSpeed;
    float acceleration;

    void Start()
    {
        currentSpeed = 0;
        topSpeed = 0.05f;
        acceleration = 2f;
    }

    void Update()
    {
        currentSpeed = topSpeed * acceleration * Input.GetAxis("Horizontal");

        if (currentSpeed > topSpeed * 1)
            currentSpeed = topSpeed * 1;
        if (currentSpeed < topSpeed * -1)
            currentSpeed = topSpeed * -1;

        if (Input.GetAxis("Horizontal") != 0)
            this.transform.position = new Vector3(currentSpeed, 0, 0) + this.transform.position;
    }
}

光是加入加速度已經需要建立不少的變數,亦無功能去提取角色當前速度相關的數值,需自行編寫程式計算,而且我們在有使用 Rigibody 部件時也不太適合直接對角色位置進行更動,所以下次我們將會介紹利用 Rigibody 的 Force 和其他便利功能的寫法。


上一篇
2D像素遊戲開發經驗分享 - Unity 玩家輸入讀取方法
下一篇
2D像素遊戲開發經驗分享 - Unity 橫向遊戲的基本移動編寫(2)
系列文
2D像素遊戲設計經驗分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言